home *** CD-ROM | disk | FTP | other *** search
- #include "mincov_int.h"
-
-
- solution_t *
- solution_alloc()
- {
- solution_t *sol;
-
- sol = ALLOC(solution_t, 1);
- sol->cost = 0;
- sol->row = sm_row_alloc();
- return sol;
- }
-
-
- void
- solution_free(sol)
- solution_t *sol;
- {
- sm_row_free(sol->row);
- FREE(sol);
- }
-
-
- solution_t *
- solution_dup(sol)
- solution_t *sol;
- {
- solution_t *new_sol;
-
- new_sol = ALLOC(solution_t, 1);
- new_sol->cost = sol->cost;
- new_sol->row = sm_row_dup(sol->row);
- return new_sol;
- }
-
-
- void
- solution_add(sol, weight, col)
- solution_t *sol;
- int *weight;
- int col;
- {
- (void) sm_row_insert(sol->row, col);
- sol->cost += WEIGHT(weight, col);
- }
-
-
- void
- solution_accept(sol, A, weight, col)
- solution_t *sol;
- sm_matrix *A;
- int *weight;
- int col;
- {
- register sm_element *p, *pnext;
- sm_col *pcol;
-
- solution_add(sol, weight, col);
-
- /* delete rows covered by this column */
- pcol = sm_get_col(A, col);
- for(p = pcol->first_row; p != 0; p = pnext) {
- pnext = p->next_row; /* grab it before it disappears */
- sm_delrow(A, p->row_num);
- }
- }
-
-
- /* ARGSUSED */
- void
- solution_reject(sol, A, weight, col)
- solution_t *sol;
- sm_matrix *A;
- int *weight;
- int col;
- {
- sm_delcol(A, col);
- }
-
-
- solution_t *
- solution_choose_best(best1, best2)
- solution_t *best1, *best2;
- {
- if (best1 != NIL(solution_t)) {
- if (best2 != NIL(solution_t)) {
- if (best1->cost <= best2->cost) {
- solution_free(best2);
- return best1;
- } else {
- solution_free(best1);
- return best2;
- }
- } else {
- return best1;
- }
- } else {
- if (best2 != NIL(solution_t)) {
- return best2;
- } else {
- return NIL(solution_t);
- }
- }
- }
-